#!/usr/bin/python3
# -*- coding: utf-8 -*-

# 字符串和编码

# 对于单个字符的编码，Python提供了ord()函数获取字符的整数表示，chr()函数把编码转换为对应的字符：
a = ord('A')
print(a)

a = ord('中')
print(a)

a = chr(100)
print(a)

a = chr(3101) # 启发可以通过这种方式取个性名字
print(a)

# 如果知道字符的整数编码，还可以用十六进制这么写str：
print('\u4e2d\u6587' == '中文')
print()

# 由于Python的字符串类型是str，在内存中以Unicode表示，一个字符对应若干个字节。
# 如果要在网络上传输，或者保存到磁盘上，就需要把str变为以字节为单位的bytes。
# Python对bytes类型的数据用带b前缀的单引号或双引号表示：
# 要注意区分'ABC'和b'ABC'，前者是str，后者虽然内容显示得和前者一样，但bytes的每个字符都只占用一个字节。
# 在bytes中，无法显示为ASCII字符的字节，用\x##显示。
a = b'ABC'
print(a)
print()

# 纯英文的str可以用ASCII编码为bytes，内容是一样的，含有中文的str可以用UTF-8编码为bytes。
# 含有中文的str无法用ASCII编码，因为中文编码的范围超过了ASCII编码的范围，
print('ABC'.encode('ascii'))
print('中文'.encode('utf-8'))
print()

# 反过来，如果我们从网络或磁盘上读取了字节流，那么读到的数据就是bytes。
# 要把bytes变为str，就需要用decode()方法：
print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
print()

# 如果bytes中包含无法解码的字节，decode()方法会报错：
# print(b'\xe4\xb8\xad\xff'.decode('utf-8'))
# 如果bytes中只有一小部分无效的字节，可以传入errors='ignore'忽略错误的字节：
print(b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore'))
print()


# 格式化
# 最后一个常见的问题是如何输出格式化的字符串。我们经常会输出类似'亲爱的xxx你好！
# 你xx月的话费是xx，余额是xx'之类的字符串，而xxx的内容都是根据变量变化的，所以，
# 需要一种简便的格式化字符串的方式。

# 在Python中，采用的格式化方式和C语言是一致的，用%实现，举例如下：
print('Hi, %s, you have $%d.' % ('Michael', 1000))
print()

# 你可能猜到了，%运算符就是用来格式化字符串的。在字符串内部，%s表示用字符串替换，
# %d表示用整数替换，有几个%?占位符，后面就跟几个变量或者值，顺序要对应好。
# 如果只有一个%?，括号可以省略。如果是表达式不可省略括号
print('%d-%f-%s-%x' % (3, 1.1, '哈哈', 0x9A))
print('%2d-%02d' % (3, 1))
print('%10.2f' % 3.1415926)
print()

# format()
# 另一种格式化字符串的方法是使用字符串的format()方法，它会用传入的参数依次替换字符串内的占位符{0}、{1}……，
# 不过这种方式写起来比%要麻烦得多：
print('Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125))
print()


# 练习
# 小明的成绩从去年的72分提升到了今年的85分，请计算小明成绩提升的百分点，
# 并用字符串格式化显示出'xx.x%'，只保留小数点后1位：
s1, s2= 72, 85
r = (s2-s1)/s1*100

print('Hello, {0}, 成绩提升了{1:.1f}%'.format('小明', r))
print('Hello, %s, 成绩提升了%.1f%%'%('小明',r))
